﻿//class Solution
//{
// public:
//	 int trap(vector<int>&height)
//		{
//		 int n = height.size();
//		 vector<int> left(n);
//		 vector<int> right(n);
//		
//			 // 预处理左侧最⼤值数组
//		left[0] = height[0];
//		for (int i = 1; i < n; i++) left[i] = max(left[i - 1], height[i]);
//		// 预处理右侧最⼤值数组
//		right[n - 1] = height[n - 1];
//		for (int i = n - 2; i >= 0; i--) right[i] = max(right[i + 1],
//			height[i]);
//		
//		int ret = 0;
//		for (int i = 1; i < n - 1; i++)
//		{
//			ret += min(left[i], right[i]) - height[i];
//		}
//		return ret;
//	}
//};



//#include <iostream>
//#include <unordered_map>
//#include <queue>
//using namespace std;
//typedef long long LL;
//int main()
//{
//    long long n, cnt, ret = 0;
//    // 1. 根据次数，构建最小堆
//    priority_queue<long long, vector<long long>, greater<LL>> pq;
//    cin >> n;
//    while (n--)
//    {
//        cin >> cnt;
//        pq.push(cnt);
//    }
//
//    while (pq.size() > 1)
//    {
//        long long x = pq.top(); pq.pop();
//        long long y = pq.top(); pq.pop();
//        ret += x + y;
//        pq.push(x + y);
//    }
//    std::cout << ret << std::endl;
//    return 0;
//}




#include <iostream>
#include <string>
#include <queue>
#include <vector>
#include <unordered_map>
using namespace std;

int main()
{
    string str;
    while (getline(cin, str))
    {
        int arr[300] = { 0 };
        for (auto ch : str)
            arr[ch]++;
        // 建大堆
        priority_queue<int, vector<int>, greater<int>> pq;
        for (int i = 0; i < 300; i++)
            if (arr[i]) pq.push(arr[i]);
        // 哈夫曼编码
        int ret = 0;
        while (pq.size() > 1)
        {
            int top1 = pq.top(); pq.pop();
            int top2 = pq.top(); pq.pop();
            ret += top1 + top2;
            pq.push(top1 + top2);
        }
        std::cout << ret << std::endl;
    }
    return 0;
}